package q54_spiralOrder;

import java.util.ArrayList;
import java.util.List;

public class Solution {
    public static void main(String[] args) {
        Solution s = new Solution();
        int[][] mat = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
        System.out.println(s.spiralOrder(mat));
    }

    /**
     * 由外向里转圈，分别设置m n c d是这一圈的行范围和列范围，然后用mode设定这一次是上下左右
     * @param matrix
     * @return
     */
    public List<Integer> spiralOrder(int[][] matrix) {
        // 一开始的行列范围都是0 - max
        int m = matrix[0].length, n = matrix.length;
        int c = 0, d = 0;
        // 模式一开始是0
        int mode = 0;
        // x y 就是当前的点坐标
        int x = 0, y = 0;
        List<Integer> res = new ArrayList<>();
        while (true){
            if (mode % 4 == 0){
                while(y < m){
                    res.add(matrix[x][y++]);
                }
                // 执行一次后要调整点的位置，并缩小对应的范围，例如m--
                y--;
                x++;
                m--;
                // 更换模式
                mode++;
            }else if (mode % 4 == 1) {
                while(x < n){
                    res.add(matrix[x++][y]);
                }
                x--;
                y--;
                n--;
                mode++;
            }else if (mode % 4 == 2) {
                while(y > c - 1){
                    res.add(matrix[x][y--]);
                }
                x--;
                y++;
                c++;
                mode++;
            }else if (mode % 4 == 3) {
                while(x > d){
                    res.add(matrix[x--][y]);
                }
                x++;
                y++;
                d++;
                mode++;
            }
            // 当res满了就结束了
            if (res.size() == matrix[0].length * matrix.length){
                break;
            }
        }

        return res;
    }
}
